package com.lynn.accesstoken.controller;

import com.lynn.accesstoken.bean.AppEntity;
import com.lynn.accesstoken.redis.RedisManager;
import com.lynn.accesstoken.service.IAppEntityService;
import com.lynn.accesstoken.utils.TokenUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @ClassName AccessTokenController
 * @Description 1. 使用appid + appsecret 生成一个 accesstoken.存入数据库
 * 2. 获取用户信息, 需要加上 accesstoken, 使用之后 如果和数据库中的对比正确, 删除旧的, 返回新的
 * 3.
 * @Author ly
 * @Date 2019-05-30 16:47
 * @Version 1.0
 */
@RestController
public class AccessTokenController {

    @Autowired
    private IAppEntityService appService;

    @Autowired
    private RedisManager redisManager;

    @RequestMapping("/getAccessToken")
    public String getAccessToken(AppEntity appEntity) {
        // 1. 获取appid 和 appsecret; 并验证是否可用
        AppEntity app = appService.getApp(appEntity);
        if (app == null) {
            return "不存在app";
        }
        if (app.getFlag() == 0) {
            return "app未启用";
        }
        // 2. 删除之前生成的accesstoken  ;appid + appsecret , 生成accesstoken , (注意删除的事务, 原子性)
        String accessToken = TokenUtils.getToken();
        // 默认保存2小时, 超时之后token无效
        redisManager.set(accessToken, app.getAppId(), 2 * 60 * 60);
        String preToken = app.getAccessToken();
        if (!StringUtils.isEmpty(preToken)) {
            redisManager.del(preToken);
        }
        appService.updateToken(appEntity, accessToken);
        // 3. 返回最新的accesstoken
        return accessToken;
    }

    /**
     * 创建一个测试的appid + appsecret
     *
     * @return
     */
    @RequestMapping("/createApp")
    public AppEntity createApp() {
        return appService.createApp();
    }

}
